﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
using AgencyEntityLib.BaseEntity;
using FormControllers;
using Ecopsy.DataTier;
using SqlLibrary;
using Ecopsy.Tools;

/// <summary>
/// Список сторон, контрол по отображению списка сторон.
/// Возможности:
///     показать список сторон на основании свойства InConditionList, поиск, сортировка, 
///     в режиме ShowShedule - показать загрузку сторон  за период
///         
/// 
/// </summary>

public partial class Ctl_ctlSideLst : System.Web.UI.UserControl
{
    /// <summary>
    /// событие удаление запси из отобранного списка
    /// </summary>
    private  Func<string,bool> _OnRemove = null;
    public Func<string, bool> OnRemove { get { return _OnRemove; } set { _OnRemove = value; } }


    protected void Page_Load(object sender, EventArgs e)
    {
    }

    public void MyDataBind()
    {


        if (ShowShedule)
        {
            List<string> s = new List<string>();
            s.Add("ss");
            lvHeadSideItem.DataSource = s;
        }
        else
        {
            lvHeadSideItem.DataSource = null;
        }
        lvHeadSideItem.DataBind(); 
        ObjectDS_PF ODS = new ObjectDS_PF(GetList);
        lvSides.DataSource = ODS.ImAsObjectDataSource;
        lvSides.DataBind();        

    }

    
    
    int oldRowCount = 0; 
    grdSide[] rs = null;
    protected  grdSide[] GetList(int startRowIndex, int maximumRows, out int RowCount)
    {
        if (rs != null) { RowCount = oldRowCount; return rs; }

        #region Функция сортирвки
        /// <summary>
        /// Функция сортировки grdSide, отличие от стандарта fOrderBy
        /// Если сортировка FullGID - сначала сортируем по номеру конструкции, потом по литере    
        /// В режиме редактиования  Выбранные записи (входящие в FilterList) - всегда вверху списка. 
        /// </summary>
        Func<ListWhere.TSortCondition, object, object, int> f_grdSideOrderBy = delegate(ListWhere.TSortCondition SortCond, object x, object y)
        {
            int res = 0;
            grdSide X = (grdSide)x;
            grdSide Y = (grdSide)y;

            if (X == Y) return res; // указатели на один объект?

            //if (EditMode) // режим редактирования?
            //{
            //    res =IsInFilterListCompare(X, Y);
            //    if (0 != res) return res;
            //}

            // Если мы сравниваем по полному номеру - Сначала сравниваем по номеру конструкции - потом по литере стороны
            if (SortCond.SortField == "FullGID")
            {
                SortCond.SortField = "ConstractionNumber";
                int r= SortFunctions.fOrderBy(SortCond, X, Y);
                if (0 == r) 
                {                
                SortCond.SortField ="Litera";
                r= SortFunctions.fOrderBy(SortCond, X, Y);                
                }

                SortCond.SortField = "FullGID";
                return r;
            }


            return SortFunctions.fOrderBy(SortCond, X, Y); 
        };
        #endregion

        // В режиме Browse  FilterList=FilterList
        if (EditMode)
        {
            ((SideLst.sqlLoadStatment)Where.ListLoadStatment).FilterList = new EntityList();
        }
        else
        {
            if (0 == FilterList.Count)
            { RowCount = 0; return rs; }// Список пуст? 

            ((SideLst.sqlLoadStatment)Where.ListLoadStatment).FilterList = FilterList;

        }
        wsConstractions _ws = (wsConstractions)GlobalConstants.CurrentAgency.WS_FactoryList[WS_FactoryList.wsKey_Constraction];                    
        ListWhere w = (ListWhere)Where;
        w.ListLoadStatment.StartRowIndex = startRowIndex;
        w.ListLoadStatment.EndRowIndex = maximumRows;
        SideLst l = _ws.GetSideLst((SideLst.sqlLoadStatment)w.ListLoadStatment);
        oldRowCount=RowCount = l.OutputRwCnt;

        List<grdSide> coll = new List<grdSide>();
        foreach (SideLst.SideItemBox s in l) coll.Add(new grdSide(s));

        //////заряжаем comparer функцией сортировки 
        rs = coll.ToArray<grdSide>();        
        Where.SortCondition.fnOrderBy = f_grdSideOrderBy;        
        Array.Sort(rs, Where.SortCondition);
                 
        return rs;
    }

    public ListWhere Where
    {
        get
        {
            string key = "Where" + KeyPref;
            if (!CacheTools.IsCacheObject(key))
            {
                ListWhere r = new ListWhere();
                r.ListLoadStatment = new SideLst.sqlLoadStatment();
                
                r.SortCondition.SortDirection = SortDirection.Ascending;
                r.SortCondition.SortField = "FullGID";
                CacheTools.SetCacheObject(key, r);
            }
            return (ListWhere)CacheTools.GetCacheObect(key);
        }

    }

    protected override void OnDataBinding(EventArgs e)
    {
        base.OnDataBinding(e);
        MyDataBind();
    }
   
    protected void lvSides_PagePropertiesChanged(object sender, EventArgs e)
    {
       
        MyDataBind();
    }

    /// <summary>
    /// Прорисовываем строчку - сторона
    /// Если включен режим  ShowShedule биндим расписание стороны
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void lvSides_ItemDataBound(object sender, ListViewItemEventArgs e)
    {
        if (!ShowShedule) return;
        ListViewDataItem r = (ListViewDataItem)e.Item;
        grdSide s = (grdSide)r.DataItem;
        ListView lv = (ListView)r.FindControl("lvSideItem");
        List<grdSide> list = new List<grdSide>();
        list.Add(s);
        lv.DataSource = list;
        lv.DataBind();
    }

    protected void lvSort(object sender, EventArgs e)
    {
        lvSides.EditIndex = -1;
        string s = ((LinkButton)sender).CommandArgument;
        Where.SortCondition.SortDirection = (Where.SortCondition.SortDirection == SortDirection.Ascending ? SortDirection.Descending : SortDirection.Ascending);
        Where.SortCondition.SortField = s;
        MyDataBind();
        pnlHeadBox.DataBind();


    }

    protected void chSel_CheckedChanged(object sender, EventArgs e)
    {
        string id = ((CheckBox)(sender)).CssClass;
        FilterList.Reset();
        if (null != FilterList[id]) FilterList.Remove(id);
        else FilterList.Add(new EntitySingle() { ID = id });

    }
        
    #region Свойства контрола   

    /// <summary>
    /// Показывать расписание?
    /// </summary>
    public bool ShowShedule 
    { 
        get { return hfShowShedule.Value == "1"; } 
        set 
        {
                hfShowShedule.Value =(value ?"1":"0");  } 
        }


    /// <summary>
    /// Список в режиме редатирования?
    /// </summary>
    public bool EditMode 
    { 
        get { return (hfSideLstState.Value == "1"); } 
        set 
        {
            hfSideLstState.Value = (value ? "1" : "0");
        } 
        }
    
    
    /// <summary>
    /// префикс - для хранения в кэше 
    /// </summary>
    public string KeyPref { get { return hfPref.Value + HttpContext.Current.User.Identity.Name; } set { hfPref.Value = value; } }    

    /// <summary>
    /// Внешнее множество ограничитель
    /// </summary>
    public EntityList FilterList
    {
        get
        {
            if (!CacheTools.IsCacheObject(KeyPref + "FilterList"))
            {
                CacheTools.SetCacheObject(KeyPref + "FilterList", new EntityList());
            };
            return (EntityList)CacheTools.GetCacheObect(KeyPref + "FilterList");
        }
        set
        {
            CacheTools.SetCacheObject(KeyPref + "FilterList", value);
        }
    }

    /// <summary>
    /// Лексема
    /// </summary>
    public string Lexeme { get { return Where.ListLoadStatment.Lexeme; } set { Where.ListLoadStatment.Lexeme = value; } }



    
    ///// <summary>
    ///// Выбранные записи в списке
    ///// </summary>    
    //public EntityList CheckedList
    //{
    //    get
    //    {
    //        string sKey = KeyPref + "CheckedLst";
    //        // если нет в кэше - сформировать
    //        if (!CacheTools.IsCacheObject(sKey))
    //        {
    //            CacheTools.SetCacheObject(sKey, new EntityList());
    //        };

    //        //if (EditMode) // Просмотреть текущую страничку на прдмет спсика
    //        //{
    //        //    EntityList l = (EntityList)CacheTools.GetCacheObect(sKey);
    //        //    foreach (ListViewDataItem i in lvSides.Items)
    //        //    {
    //        //        CheckBox ch = (CheckBox)i.FindControl("chSelected");
    //        //        if( null!=l[ch.CssClass]) 
    //        //              l.Remove(ch.CssClass);
    //        //        if (ch.Checked) 
    //        //              l.Add(new EntitySingle() { ID = ch.CssClass });
    //        //    }
    //        //    CacheTools.SetCacheObject(sKey, l);
    //        //}

    //        return (EntityList)CacheTools.GetCacheObect(sKey);
            
    //    }
    //    set
    //    {
    //        CacheTools.SetCacheObject(KeyPref + "CheckedLst", value);
    //    }
    //}

    public void ResetPager()
    {
        DataPager.SetPageProperties(0, DataPager.MaximumRows, false); 
    }

    #endregion

    #region Офрмление раскладки    

    /// <summary>
    /// общая величина гридника - если показывать гридник - абсолютная равна ширине экарана если нет - 100% внешнего контейнера
    /// </summary>
    /// <returns></returns>
    protected string GetBoxWidth()
    {
    //    return (ShowShedule ? (GlobalConstants.ScreenValues.W - 24).ToString() + "px" : "100%");
        return "100%";
    }

    protected string GetSheduleStyle()
    {
        if (ShowShedule)
            return "text-align :left;width :40%";
        else
            return "width :1px%";
    }

    protected string Get_TdStyle_Constraction()
    {
        if (ShowShedule)
            return "'text-align :left; width:15%'";
        else
            return "'text-align :left; width:30%'";
    }

    protected string GetNBSP()
    {
        if (ShowShedule) return "&nbsp";
        return "";
    }

    protected string GetHeadCss(string HearTd)
    {
        if (Where.SortCondition.SortField != HearTd) return string.Empty;
        return "sort" + Where.SortCondition.SortDirection.ToString();
    }

    protected string GetSelectStyle(string ItemId)
    {
        if (!EditMode)
            return "grd_td_item";
        else
        {            
            if (ItemIsSelected(ItemId))
                return "grd_td_item_caption";
            else
                return "grd_td_item";
        }


    }

    protected bool ItemIsSelected(string ItemId)
    {
        if (!EditMode) return false; 
        FilterList.Reset();
        return (FilterList[ItemId] != null);
    }

    #endregion


    protected string OnFullSizeClick(string SideId)
    {   
        return "window.open('PageProcessor.aspx?Page=iFrameOperation_SideBrowse.aspx?" + iAdmin_Page.qSideID + "=" + SideId + "')";
    }

    protected void SelListRemove(object sender, System.Web.UI.ImageClickEventArgs e)
    {
        string s = ((ImageButton)(sender)).CommandArgument;
        if (null != OnRemove) OnRemove(s);

    }
}
